package db

import (
	"reflect"
	errs "tacitus/library/error"
)

// 获取传入的结构体(或者指向结构体的指针或者元素是结构体的切片、数组)的字段对应的列名映射
// tag是要读取的tag,是对应的列名
// tn是结构体对应的表的名称，一般只需要在使用别名时传入
// TODO 添加对不同目标类型的适配
// TODO 增加对嵌套结构体的适配
func FieldMap(target interface{}, tag string, tn string) map[string]string {
	t :=reflect.TypeOf(target)
	if t.Kind() != reflect.Struct {
		panic(errs.Called("错误的类型"))
	}
	res := make(map[string]string)
	for i:=0; i< t.NumField(); i++ {
		f := t.Field(i)
		cn := f.Name
		if cn2 := f.Tag.Get(tag); cn2 != "" {
			cn = cn2
		}
		if tn == "" {
			res[cn] = cn
		} else {
			res[cn] = tn+"."+cn
		}
	}
	return res
}